import { ref, nextTick } from 'vue'
import { message } from 'ant-design-vue'
import { voiceService } from './voiceService'

/**
 * 试听功能组合式API
 * 封装音频播放相关的状态管理和逻辑
 */
export function useVoicePreview() {
  // 响应式状态
  const audioPlayer = ref(null)
  const isPlaying = ref(false)
  const audioUrl = ref('')
  const isLoading = ref(false)

  /**
   * 初始化音频播放器引用
   * @param {HTMLAudioElement} playerRef - 音频播放器DOM引用
   */
  const initAudioPlayer = (playerRef) => {
    audioPlayer.value = playerRef
  }

  /**
   * 播放或停止音频
   * @param {string} text - 要转换的文本
   * @param {string} voiceType - 音色类型
   */
  const togglePlayback = async (text, voiceType = 'male') => {
    if (!text?.trim()) {
      message.warning('请先生成内容后再试听')
      return
    }

    try {
      // 如果正在播放，则停止
      if (isPlaying.value) {
        stopPlayback()
        return
      }

      // 开始播放
      await startPlayback(text, voiceType)
    } catch (error) {
      console.error('音频播放错误:', error)
      message.error('音频播放失败：' + (error.message || '未知错误'))
      resetPlaybackState()
    }
  }

  /**
   * 开始播放音频
   * @param {string} text - 文本内容
   * @param {string} voiceType - 音色类型
   */
  const startPlayback = async (text, voiceType) => {
    isLoading.value = true
    message.loading('正在生成音频...', 0)

    try {
      // 调用语音服务生成音频，传递播放结束回调
      const response = await voiceService.textToSpeech(text, voiceType, onAudioEnded)

      if (response?.success && response?.audioUrl) {
        audioUrl.value = response.audioUrl

        // 如果使用Web Speech API，则不需要audio元素
        if (response.audioUrl === 'web-speech-api') {
          isPlaying.value = true
          message.destroy()
          message.success('开始播放语音')

          // Web Speech API会通过回调自动处理播放结束事件
        } else {
          // 使用传统的audio元素播放
          if (audioPlayer.value) {
            audioPlayer.value.src = audioUrl.value
            audioPlayer.value.style.display = 'block'

            // 等待DOM更新后播放
            await nextTick()
            await audioPlayer.value.play()

            isPlaying.value = true
            message.destroy()
            message.success('开始播放音频')
          }
        }
      } else {
        throw new Error('音频生成失败')
      }
    } finally {
      isLoading.value = false
      message.destroy()
    }
  }

  /**
   * 停止播放音频
   */
  const stopPlayback = () => {
    // 停止Web Speech API
    if (window.speechSynthesis) {
      window.speechSynthesis.cancel()
    }

    // 停止传统音频播放
    if (audioPlayer.value) {
      audioPlayer.value.pause()
      audioPlayer.value.currentTime = 0
      audioPlayer.value.style.display = 'none'
    }

    isPlaying.value = false
  }

  /**
   * 重置播放状态
   */
  const resetPlaybackState = () => {
    stopPlayback()
    audioUrl.value = ''
    isLoading.value = false
  }

  /**
   * 音频播放结束事件处理
   */
  const onAudioEnded = () => {
    isPlaying.value = false
    isLoading.value = false
    if (audioPlayer.value) {
      audioPlayer.value.style.display = 'none'
    }

    message.success('音频播放完成')
  }

  /**
   * 音频播放错误事件处理
   */
  const onAudioError = (error) => {
    console.error('音频播放错误:', error)
    resetPlaybackState()
    message.error('音频播放出错')
  }

  /**
   * 下载当前音频
   * @param {string} filename - 文件名
   */
  const downloadCurrentAudio = async (filename) => {
    if (!audioUrl.value) {
      message.warning('请先生成音频后再下载')
      return
    }

    try {
      await voiceService.downloadAudio(audioUrl.value, filename)
    } catch (error) {
      console.error('下载失败:', error)
      message.error('下载失败，请重试')
    }
  }

  return {
    // 状态
    audioPlayer,
    isPlaying,
    audioUrl,
    isLoading,

    // 方法
    initAudioPlayer,
    togglePlayback,
    stopPlayback,
    resetPlaybackState,
    onAudioEnded,
    onAudioError,
    downloadCurrentAudio
  }
}